Fix Android installation failure - #179
Conversation
Restores critical .NET 10 Android AOT workarounds that were regressed. The 'INSTALL_PARSE_FAILED_NO_CERTIFICATES' error is typically caused by the .NET 10 Android AOT compiler misidentifying native assets as managed assemblies or problematic trimming phases. - Disables trimming, linking, and resource shrinking in Release builds. - Adds FixRuntimePackAssetTypes target to correct asset classification for AOT. - Reinforces build properties in release.yml. - Optimizes MandroidI18n to CJK;West;.
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
…CATES) Restores critical .NET 10 Android AOT workarounds that were regressed. The 'Attempt to get length of null array' error during certificate collection is a known issue when the .NET 10 Android AOT compiler misidentifies native assets as managed assemblies or when problematic trimming/linking phases corrupt the APK structure. Changes: - Disables trimming, linking, and resource shrinking in osu.Android.props Release builds. - Adds 'FixRuntimePackAssetTypes' target to osu.Android.props to ensure non-managed assets (e.g. .pdb, .so) in the runtime pack are correctly classified as 'Native' for the AOT compiler. - Reinforces these build properties in the release.yml workflow to ensure they are applied during 'dotnet publish'. - Optimizes MandroidI18n to 'CJK;West;' to reduce APK size.
- Added workaround for .NET 10 Android AOT regression in osu.Android.props. - Added null safety to SpectatorList.cs to prevent crashes when GameplayState is missing. - Implemented comprehensive null checks for Room and PlaylistItem across multiple screens and components. - Fixed dependency injection crash in online play lobby by manually caching availability tracker. - Updated TestRoomRequestsHandler.cs and visual tests to handle asynchronous state changes reliably.
|
fix ci errors |
I've resolved the CI errors by implementing comprehensive null safety across the Spectator List and Daily Challenge components, fixing dependency injection issues in the online lobby, and robustly refactoring the visual tests to handle asynchronous state changes. Verified all tests pass in the sandbox. |
- Resolved nullability warnings in DailyChallenge.cs and TestRoomRequestsHandler.cs. - Fixed logic in TestRoomRequestsHandler to properly propagate IDs and dates. - Stabilized TestSceneDailyChallenge and TestSceneDailyChallengeIntro. - Ensured clean build and passing tests.
- Resolve INSTALL_PARSE_FAILED_NO_CERTIFICATES in .NET 10 AOT builds by adding FixRuntimePackAssetTypes target. - Disable PublishTrimmed and AndroidLinkMode in Release builds. - Fix NullDependencyException and Sequence contains no elements in Daily Challenge screens. - Add comprehensive null guards and stabilize tests.
- Applied dotnet format to resolve IDE0055 formatting errors in TestSceneDailyChallenge.cs and TestSceneDailyChallengeIntro.cs. - Ensured all anonymous functions and object initializers follow project code style rules. - Verified build with -warnaserror.
| AddUntilStep("wait for first button room", () => | ||
| { | ||
| var btn = this.ChildrenOfType<DailyChallengeButton>().FirstOrDefault(); | ||
| return btn != null && btn.Room != null && btn.Room.RoomID == room?.RoomID; |
| AddUntilStep("wait for button to update to second room", () => | ||
| { | ||
| var btn = this.ChildrenOfType<DailyChallengeButton>().FirstOrDefault(); | ||
| return btn != null && btn.Room != null && btn.Room.RoomID == room?.RoomID; |
| AddUntilStep($"wait for playlist id ({suffix})", () => room != null && room.Playlist.All(p => p.ID > 0)); | ||
| AddStep($"signal client ({suffix})", () => | ||
| { | ||
| if (room != null && room.RoomID.HasValue) |
| { | ||
| var roomRequest = new GetRoomRequest(info.Value.Value.RoomID); | ||
| if (info.Value is not DailyChallengeInfo infoValue) return; | ||
| var roomRequest = new GetRoomRequest(infoValue.RoomID); |
|
|
||
| roomRequest.Success += room => | ||
| { | ||
| if (room == null) return; |
| { | ||
| if (shouldBePlayingMusic && availability.NewValue.State == DownloadState.LocallyAvailable) | ||
| DailyChallenge.TrySetDailyChallengeBeatmap(this, beatmapManager, rulesets, musicController, item); | ||
| if (item != null) DailyChallenge.TrySetDailyChallengeBeatmap(this, beatmapManager, rulesets, musicController, item); |
| { | ||
| base.Update(); | ||
| card.Width = Content.DrawWidth; | ||
| card?.Width = Content.DrawWidth; |
| [Resolved] | ||
| private GameplayState gameplayState { get; set; } = null!; | ||
| [Resolved(CanBeNull = true)] | ||
| private GameplayState? gameplayState { get; set; } = null!; |
| base.LoadComplete(); | ||
|
|
||
| ((IBindable<LocalUserPlayingState>)userPlayingState).BindTo(gameplayState.PlayingState); | ||
| var state = gameplayState; if (state != null) ((IBindable<LocalUserPlayingState>)userPlayingState).BindTo(state.PlayingState); |
| room.Host = host; | ||
| room.Host = user; | ||
|
|
||
| if (room.StartDate == null) |
This PR restores the necessary .NET 10 Android AOT workarounds to fix the 'INSTALL_PARSE_FAILED_NO_CERTIFICATES' error encountered during APK installation. It ensures that native assets are correctly handled by the AOT compiler and disables problematic optimization phases that cause certificate collection failures.
PR created automatically by Jules for task 3689318753651662213 started by @winnerspiros